■ マルチスレッド | |
■ スレッドプログラムの基本的流れ | |
|
|
■ スレッドプログラムの基本的流れ | |
@BCBにはTThreadクラスがあり、継承により新しい所要の派生クラスをつくりをつくります。 (Win32APIだけでのコードよりすっきりしたコードを書くことができます) A派生クラスのオブジェクトを生成する。 BExecute関数をオーバーライドする。 Excute関数の中にスレッドとして実行したいコードを書く CExcute関数の中でスレッドの終了を Terminated関数で監視する DVCLが含まれるコードはSynchronize( )関数の中に書く (Synchronize( )関数のに書かれたコードは時分割されたメインスレッドの合間でメインスレッドと同期をとって実行 される。 E終了を確認したらオブジェクトを解放する |
|
//<コードの構成> プログラム例 // 1.非イベント動作型RS232C受信スレッド // 2.イベント動作型RS232C受信スレッド //Unit1.h //--------------------------------------------------------------------------- class TSubThread : public TThread //@ 派生クラスの宣言 { public: __fastcall TSubThread(bool CreateSuspended);// CreateSuspended=falseなら動作状態でスレッドが生成される。 private: void __fastcall Execute(void); //★ Execute( )関数をオーバーライド }; //---------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE 管理のコンポーネント void __fastcall FormClose(TObject *Sender, TCloseAction &Action); private: // ユーザー宣言 TSubThread *subThread; //Aオブジェクトの宣言 __fastcall TForm1(TComponent* Owner); }; Unit1.cpp //------------------------------------------------------------------------------ //オブジェクトの生成 _fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { subThread = new TSubThread(true);//B オブジェクトの生成(オブジェクトへ割り当て) //CreateSuspended=trueなのでスレッドは停止状態で生成される。 } //--------------------------------------------------------------------------- __fastcall TSubThread::TSubThread(void) : TThread(true) //スレッドのコンストラクタ { FreeOnTerminate = true; // ★ スレッドの終了後にオブジェクトを自動解放する Resume(); // C スレッドを動作させる } //--------------------------------------------------------------------------- void __fastcall TReceiveThread::Execute() { while(!Terminated) //終了までまつ { //実際に実行したいコードを書く //D スレッドで繰返し実行 Synchronize(UpdateReceiveEdit); //E VCLはWindowsがメインスレッドと同期をとりここで処理 } } //--------------------------------------------------------------------------- void __fastcall TReceiveThread::UpdateReceiveEdit(void) { //VCLを含むコードはすべてここに書く } //------------------------------------------------------------------------------ void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { if(subThread)subThread->Terminate();//Fスレッド終了 } |
|
|
|